MainFrame.cc

Go to the documentation of this file.
00001 /*
00002  * hack4u
00003  * Copyright (C) 2004-2006 emuWorks
00004  * http://games.technoplaza.net/
00005  *
00006  * This file is part of hack4u.
00007  *
00008  * hack4u is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version.
00012  *
00013  * hack4u is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License
00019  * along with hack4u; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00021  */
00022 
00023 // $Id: MainFrame.cc,v 1.50 2006/03/21 11:53:54 technoplaza Exp $
00024 
00025 #ifdef HAVE_CONFIG_H
00026     #include <config.h>
00027 #endif
00028 
00029 #include <wx/wxprec.h>
00030 
00031 #ifndef WX_PRECOMP
00032     #include <wx/wx.h>
00033 #endif
00034 
00035 #include <wx/xrc/xmlres.h>
00036 
00037 #include <cstring>
00038 #include <fstream>
00039 
00040 #include "hack4u.hh"
00041 #include "exceptions/FileIOException.hh"
00042 #include "exceptions/InvalidSRAMException.hh"
00043 #include "res/icon16x16.xpm"
00044 #include "model/SaveSlot.hh"
00045 #include "view/FileDropTarget.hh"
00046 #include "view/MainFrame.hh"
00047 
00048 using namespace hack4u;
00049 
00050 const wxString MainFrame::CHARACTER_NAMES[] = {
00051     wxT("Mage"), wxT("Bard"), wxT("Fighter"), wxT("Druid"),
00052     wxT("Tinker"), wxT("Paladin"), wxT("Ranger"), wxT("Shepherd")
00053 };
00054 
00055 const wxString MainFrame::CITY_NAMES[] = {
00056     wxT("Moonglow"), wxT("Britain"), wxT("Jhelom"), wxT("Yew"),
00057     wxT("Minoc"), wxT("Trinsic"), wxT("Skara Brae"), wxT("Magincia")
00058 };
00059 
00060 const std::pair<int, int> MainFrame::BALLOON_LOCATIONS[] = {
00061     std::pair<int, int>(131, 224), std::pair<int, int>(108, 84),
00062     std::pair<int, int>(218, 38), std::pair<int, int>(45, 57),
00063     std::pair<int, int>(22, 159), std::pair<int, int>(186, 104),
00064     std::pair<int, int>(130, 22), std::pair<int, int>(171, 188),
00065     
00066     std::pair<int, int>(106, 216), std::pair<int, int>(50, 26),
00067     std::pair<int, int>(244, 147),
00068     
00069     std::pair<int, int>(148, 96), std::pair<int, int>(59, 199),
00070     std::pair<int, int>(159, 136), std::pair<int, int>(92, 137)
00071 };
00072 
00073 const std::pair<int, int> MainFrame::PIRATESHIP_LOCATIONS[] = {
00074     std::pair<int, int>(134, 230), std::pair<int, int>(109, 84),
00075     std::pair<int, int>(222, 40), std::pair<int, int>(18, 57),
00076     std::pair<int, int>(19, 168), std::pair<int, int>(184, 108),
00077     std::pair<int, int>(127, 19), std::pair<int, int>(169, 190),
00078     
00079     std::pair<int, int>(108, 216), std::pair<int, int>(47, 26),
00080     std::pair<int, int>(242, 148),
00081     
00082     std::pair<int, int>(145, 96), std::pair<int, int>(59, 196),
00083     std::pair<int, int>(158, 134), std::pair<int, int>(92, 135)
00084 };
00085 
00086 const int MainFrame::INN_INDEX[] = {
00087     1, 1, 1, 1, 1, 0, 1, 2, 3, 4, 5, 6, 1, 1, 7
00088 };
00089 
00090 MainFrame::MainFrame() : saveslot(0), sram(0), location(LMOONGLOW),
00091                          ignoreEvents(false), open(false) {
00092     SetParent(NULL);
00093     CreateControls();
00094     GetSizer()->SetSizeHints(this);
00095     Centre();
00096     
00097     XRCCTRL(*this, "IDN_HACK4U", wxNotebook)->Show(false);
00098     
00099     SetDropTarget(new FileDropTarget(this));
00100 }
00101 
00102 void MainFrame::CreateControls() {
00103     wxXmlResource::Get()->LoadFrame(this, GetParent(), wxT("IDF_HACK4U"));
00104     SetIcon(wxIcon(icon16x16_xpm));
00105     
00106     wxMenuBar *mb = GetMenuBar();
00107     gameMenu = mb->FindMenu(wxT("Game"));
00108     locationMenu = mb->FindMenu(wxT("Location"));
00109     
00110     mb->EnableTop(gameMenu, false);
00111     mb->EnableTop(locationMenu, false);
00112     
00113     wxArrayString letters;
00114     letters.Add(wxT("A")); letters.Add(wxT("B")); letters.Add(wxT("C"));
00115     letters.Add(wxT("D")); letters.Add(wxT("E")); letters.Add(wxT("F"));
00116     letters.Add(wxT("G")); letters.Add(wxT("H")); letters.Add(wxT("I"));
00117     letters.Add(wxT("J")); letters.Add(wxT("K")); letters.Add(wxT("L"));
00118     letters.Add(wxT("M")); letters.Add(wxT("N")); letters.Add(wxT("O"));
00119     letters.Add(wxT("P")); letters.Add(wxT("Q")); letters.Add(wxT("R"));
00120     letters.Add(wxT("S")); letters.Add(wxT("T")); letters.Add(wxT("U"));
00121     letters.Add(wxT("V")); letters.Add(wxT("W")); letters.Add(wxT("X"));
00122     letters.Add(wxT("Y")); letters.Add(wxT("Z")); letters.Add(wxT("a"));
00123     letters.Add(wxT("b")); letters.Add(wxT("c")); letters.Add(wxT("d"));
00124     letters.Add(wxT("e")); letters.Add(wxT("f")); letters.Add(wxT("g"));
00125     letters.Add(wxT("h")); letters.Add(wxT("i")); letters.Add(wxT("j"));
00126     letters.Add(wxT("k")); letters.Add(wxT("l")); letters.Add(wxT("m"));
00127     letters.Add(wxT("n")); letters.Add(wxT("o")); letters.Add(wxT("p"));
00128     letters.Add(wxT("q")); letters.Add(wxT("r")); letters.Add(wxT("s"));
00129     letters.Add(wxT("t")); letters.Add(wxT("u")); letters.Add(wxT("v"));
00130     letters.Add(wxT("w")); letters.Add(wxT("x")); letters.Add(wxT("y"));
00131     letters.Add(wxT("z")); letters.Add(wxT("!")); letters.Add(wxT("-"));
00132     letters.Add(wxT("_"));
00133     
00134     wxTextValidator herosNameValidator(wxFILTER_INCLUDE_CHAR_LIST);
00135     herosNameValidator.SetIncludes(letters);
00136     
00137     XRCCTRL(*this, "IDT_HERO_NAME", wxTextCtrl)->
00138         SetValidator(herosNameValidator);
00139     
00140     wxTextValidator numberValidator(wxFILTER_NUMERIC);
00141     
00142     XRCCTRL(*this, "IDT_PARTY_GOLD", wxTextCtrl)->SetValidator(numberValidator);
00143     XRCCTRL(*this, "IDT_CHARACTER_HP", wxTextCtrl)->
00144         SetValidator(numberValidator);
00145     XRCCTRL(*this, "IDT_CHARACTER_MP", wxTextCtrl)->
00146         SetValidator(numberValidator);
00147     XRCCTRL(*this, "IDT_CHARACTER_EXPERIENCE", wxTextCtrl)->
00148         SetValidator(numberValidator);
00149     XRCCTRL(*this, "IDT_CHARACTER_MAXHP", wxTextCtrl)->
00150         SetValidator(numberValidator);
00151     XRCCTRL(*this, "IDT_CHARACTER_MAXMP", wxTextCtrl)->
00152         SetValidator(numberValidator);
00153     XRCCTRL(*this, "IDT_CHARACTER_STRENGTH", wxTextCtrl)->
00154         SetValidator(numberValidator);
00155     XRCCTRL(*this, "IDT_CHARACTER_INTELLIGENCE", wxTextCtrl)->
00156         SetValidator(numberValidator);
00157     XRCCTRL(*this, "IDT_CHARACTER_DEXTERITY", wxTextCtrl)->
00158         SetValidator(numberValidator);
00159     
00160     wxArrayString numbers;
00161     numbers.Add(wxT("2")); numbers.Add(wxT("3")); numbers.Add(wxT("4"));
00162     numbers.Add(wxT("5")); numbers.Add(wxT("6")); numbers.Add(wxT("7"));
00163     numbers.Add(wxT("8"));
00164     
00165     wxTextValidator levelValidator(wxFILTER_INCLUDE_CHAR_LIST);
00166     levelValidator.SetIncludes(numbers);
00167     
00168     XRCCTRL(*this, "IDT_CHARACTER_LEVEL", wxTextCtrl)->
00169         SetValidator(levelValidator);
00170         
00171     memberChoice[0] = XRCCTRL(*this, "IDC_PARTY_MEMBER1", wxChoice);
00172     memberChoice[1] = XRCCTRL(*this, "IDC_PARTY_MEMBER2", wxChoice);
00173     memberChoice[2] = XRCCTRL(*this, "IDC_PARTY_MEMBER3", wxChoice);
00174     memberChoice[3] = XRCCTRL(*this, "IDC_PARTY_MEMBER4", wxChoice);
00175     
00176     itemChoice[0] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT1", wxChoice);
00177     itemEquippedCheck[0] =
00178         XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED1", wxCheckBox);
00179     
00180     itemChoice[1] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT2", wxChoice);
00181     itemEquippedCheck[1] =
00182         XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED2", wxCheckBox);
00183     
00184     itemChoice[2] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT3", wxChoice);
00185     itemEquippedCheck[2] =
00186         XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED3", wxCheckBox);
00187     
00188     itemChoice[3] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT4", wxChoice);
00189     itemEquippedCheck[3] =
00190         XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED4", wxCheckBox);
00191     
00192     itemChoice[4] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT5", wxChoice);
00193     itemEquippedCheck[4] =
00194         XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED5", wxCheckBox);
00195     
00196     itemChoice[5] = XRCCTRL(*this, "IDC_CHARACTER_EQUIPMENT6", wxChoice);
00197     itemEquippedCheck[5] =
00198         XRCCTRL(*this, "IDC_CHARACTER_EQUIPPED6", wxCheckBox);
00199 }
00200 
00201 void MainFrame::setEquipment(int slot) {
00202     enum Character character = static_cast<enum Character>
00203         (XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection());
00204     int item = itemChoice[slot]->GetSelection();
00205     
00206     if (itemEquippedCheck[slot]->IsChecked() && (item > 0)) {
00207         item |= 0x80;
00208     }
00209     
00210     saveslot->setEquipment(character, slot, item);
00211 }
00212 
00213 void MainFrame::setFeluccaOptions(enum City trammel) {
00214     wxChoice *feluccaChoice =
00215         XRCCTRL(*this, "IDC_TRANSPORTATION_FELUCCA", wxChoice);
00216     feluccaChoice->Clear();
00217     
00218     switch (trammel) {
00219         case MOONGLOW:
00220             feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00221             feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00222             feluccaChoice->Append(CITY_NAMES[JHELOM]);
00223             break;
00224         case BRITAIN:
00225             feluccaChoice->Append(CITY_NAMES[YEW]);
00226             feluccaChoice->Append(CITY_NAMES[MINOC]);
00227             feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00228             break;
00229         case JHELOM:
00230             feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00231             feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00232             feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00233             break;
00234         case YEW:
00235             feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00236             feluccaChoice->Append(CITY_NAMES[JHELOM]);
00237             feluccaChoice->Append(CITY_NAMES[YEW]);
00238             break;
00239         case MINOC:
00240             feluccaChoice->Append(CITY_NAMES[MINOC]);
00241             feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00242             feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00243             break;
00244         case TRINSIC:
00245             feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00246             feluccaChoice->Append(CITY_NAMES[MOONGLOW]);
00247             feluccaChoice->Append(CITY_NAMES[BRITAIN]);
00248             break;
00249         case SKARABRAE:
00250             feluccaChoice->Append(CITY_NAMES[JHELOM]);
00251             feluccaChoice->Append(CITY_NAMES[YEW]);
00252             feluccaChoice->Append(CITY_NAMES[MINOC]);
00253             break;
00254         case MAGINCIA:
00255             feluccaChoice->Append(CITY_NAMES[TRINSIC]);
00256             feluccaChoice->Append(CITY_NAMES[SKARABRAE]);
00257             feluccaChoice->Append(CITY_NAMES[MAGINCIA]);
00258             break;
00259     }
00260     
00261     feluccaChoice->SetSelection(0);
00262 }
00263 
00264 bool MainFrame::hasValidEquipment(enum Character character) const {
00265     bool bow = false;
00266     bool weapon = false;
00267     bool armor = false;
00268     
00269     for (int i = 0; i < 6; ++i) {
00270         int item = saveslot->getEquipment(character, i);
00271         
00272         if (item & 0x80) {
00273             item &= 0x7F;
00274             
00275             if ((item > 0x1) && (item <= 0x4)) {
00276                 if (bow) {
00277                     return false;
00278                 }
00279                 
00280                 bow = true;
00281             } else if ((item > 0x4) && (item <= 0xF)) {
00282                 if (weapon) {
00283                     return false;
00284                 }
00285                 
00286                 weapon = true;
00287             } else if ((item > 0xF) && (item <= 0x19)) {
00288                 if (armor) {
00289                     return false;
00290                 }
00291                 
00292                 armor = true;
00293             }
00294         }
00295     }
00296     
00297     return true;
00298 }
00299 
00300 bool MainFrame::isValidParty() const {
00301     char members = 0;
00302     bool end = false;
00303     
00304     for (int i = 0; i < 4; ++i) {
00305         int member = memberChoice[i]->GetSelection();
00306         
00307         if (i > 0) {
00308             member--;
00309         }
00310 
00311         if (member == -1) {
00312             end = true;
00313         } else {
00314             if (members & (1 << member)) {
00315                 return false;
00316             }
00317         
00318             if (end) {
00319                 return false;
00320             }
00321 
00322             members |= (1 << member);
00323         }
00324     }
00325     
00326     return true;
00327 }
00328 
00329 bool MainFrame::close() {
00330     // we must be open to close
00331     wxASSERT(isOpen());
00332     
00333     if (sram->isModified()) {
00334         int choice = wxMessageBox(wxT("Save Game File Before Closing?"),
00335                                   wxT("Warning: Unsaved Changes"),
00336                                   wxYES_NO | wxCANCEL | wxICON_QUESTION,
00337                                   this);
00338         
00339         if (choice == wxYES) {
00340             if (!save(sramFile)) {
00341                 return false;
00342             }
00343         } else if (choice == wxCANCEL) {
00344             return false;
00345         }
00346     }
00347     
00348     XRCCTRL(*this, "IDN_HACK4U", wxNotebook)->Show(false);
00349     GetMenuBar()->FindItem(XRCID("IDM_GAME_GAME1"))->Check();
00350     
00351     open = false;
00352     
00353     delete sram;
00354     sram = 0;
00355     
00356     GetMenuBar()->EnableTop(gameMenu, false);
00357     GetMenuBar()->EnableTop(locationMenu, false);
00358     
00359     return true;
00360 }
00361 
00362 void MainFrame::load(const wxString &filename) {
00363     if (isOpen()) {
00364         if (!close()) {
00365             return;
00366         }
00367     }
00368     
00369     try {
00370         sram = new SRAMFile(filename);
00371     } catch (InvalidSRAMException &e) {
00372         if (e.getError() == ISE_NOSUCHFILE) {
00373             // unable to open file
00374             wxMessageBox(wxT("Unable to open the SRAM file."),
00375                          wxT("File Open Error"), wxOK | wxICON_ERROR);
00376         } else if (e.getError() == ISE_IOERROR) {
00377             wxMessageBox(wxT("Unable to read the SRAM file."),
00378                          wxT("File I/O Error"), wxOK | wxICON_ERROR);
00379         } else {
00380             // must be a bad checksum if we're here
00381             wxASSERT(e.getError() == ISE_BADCHECKSUM);
00382             
00383             wxMessageBox(wxT("No Ultima: Quest of the Avatar games"
00384                              " exist in the SRAM file you loaded."),
00385                          wxT("Error: No Games Found"), wxOK | wxICON_ERROR);
00386         }
00387         
00388         return;
00389     }
00390     
00391     for (int i = 0; i < 3; ++i) {
00392         if (sram->isValid(i)) {
00393             loadGame(i);
00394             break;
00395         }
00396     }
00397     
00398     open = true;
00399     
00400     GetMenuBar()->EnableTop(gameMenu, true);
00401     GetMenuBar()->EnableTop(locationMenu, true);
00402 }
00403 
00404 void MainFrame::loadGame(int game) {
00405     saveslot = sram->getSaveSlot(game);
00406     
00407     ignoreEvents = true;
00408     
00409     // load hero's name
00410     XRCCTRL(*this, "IDT_HERO_NAME", wxTextCtrl)->
00411         SetValue(saveslot->getHerosName());
00412         
00413     // load virtues
00414     XRCCTRL(*this, "IDS_HERO_HONESTY", wxSlider)->
00415         SetValue(saveslot->getVirtue(HONESTY));
00416     XRCCTRL(*this, "IDS_HERO_COMPASSION", wxSlider)->
00417         SetValue(saveslot->getVirtue(COMPASSION));
00418     XRCCTRL(*this, "IDS_HERO_VALOR", wxSlider)->
00419         SetValue(saveslot->getVirtue(VALOR));
00420     XRCCTRL(*this, "IDS_HERO_JUSTICE", wxSlider)->
00421         SetValue(saveslot->getVirtue(JUSTICE));
00422     XRCCTRL(*this, "IDS_HERO_SACRIFICE", wxSlider)->
00423         SetValue(saveslot->getVirtue(SACRIFICE));
00424     XRCCTRL(*this, "IDS_HERO_HONOR", wxSlider)->
00425         SetValue(saveslot->getVirtue(HONOR));
00426     XRCCTRL(*this, "IDS_HERO_SPIRITUALITY", wxSlider)->
00427         SetValue(saveslot->getVirtue(SPIRITUALITY));
00428     XRCCTRL(*this, "IDS_HERO_HUMILITY", wxSlider)->
00429         SetValue(saveslot->getVirtue(HUMILITY));
00430         
00431     // load party's start location
00432     XRCCTRL(*this, "IDC_PARTY_START", wxChoice)->
00433         SetSelection(INN_INDEX[saveslot->getStartLocation()]);
00434         
00435     // load party's gold
00436     XRCCTRL(*this, "IDT_PARTY_GOLD", wxTextCtrl)->
00437         SetValue(wxString::Format(wxT("%d"), saveslot->getGold()));
00438         
00439     // load party members
00440     XRCCTRL(*this, "IDC_PARTY_MEMBER1", wxChoice)->
00441         SetSelection(saveslot->getMember(0) - 1);
00442     XRCCTRL(*this, "IDC_PARTY_MEMBER2", wxChoice)->
00443         SetSelection(saveslot->getMember(1));
00444     XRCCTRL(*this, "IDC_PARTY_MEMBER3", wxChoice)->
00445         SetSelection(saveslot->getMember(2));
00446     XRCCTRL(*this, "IDC_PARTY_MEMBER4", wxChoice)->
00447         SetSelection(saveslot->getMember(3));
00448         
00449     // load joined members
00450     XRCCTRL(*this, "IDC_PARTY_MAGE", wxCheckBox)->
00451         SetValue(saveslot->hasJoined(MAGE));
00452     XRCCTRL(*this, "IDC_PARTY_BARD", wxCheckBox)->
00453         SetValue(saveslot->hasJoined(BARD));
00454     XRCCTRL(*this, "IDC_PARTY_FIGHTER", wxCheckBox)->
00455         SetValue(saveslot->hasJoined(FIGHTER));
00456     XRCCTRL(*this, "IDC_PARTY_DRUID", wxCheckBox)->
00457         SetValue(saveslot->hasJoined(DRUID));
00458     XRCCTRL(*this, "IDC_PARTY_TINKER", wxCheckBox)->
00459         SetValue(saveslot->hasJoined(TINKER));
00460     XRCCTRL(*this, "IDC_PARTY_PALADIN", wxCheckBox)->
00461         SetValue(saveslot->hasJoined(PALADIN));
00462     XRCCTRL(*this, "IDC_PARTY_RANGER", wxCheckBox)->
00463         SetValue(saveslot->hasJoined(RANGER));
00464     XRCCTRL(*this, "IDC_PARTY_SHEPHERD", wxCheckBox)->
00465         SetValue(saveslot->hasJoined(SHEPHERD));
00466         
00467     // load known magic
00468     XRCCTRL(*this, "IDC_PARTY_LIGHT", wxCheckBox)->
00469         SetValue(saveslot->hasMagic(LIGHT));
00470     XRCCTRL(*this, "IDC_PARTY_MISSILE", wxCheckBox)->
00471         SetValue(saveslot->hasMagic(MISSILE));
00472     XRCCTRL(*this, "IDC_PARTY_AWAKEN", wxCheckBox)->
00473         SetValue(saveslot->hasMagic(AWAKEN));
00474     XRCCTRL(*this, "IDC_PARTY_CURE", wxCheckBox)->
00475         SetValue(saveslot->hasMagic(CURE));
00476     XRCCTRL(*this, "IDC_PARTY_WIND", wxCheckBox)->
00477         SetValue(saveslot->hasMagic(WIND));
00478     XRCCTRL(*this, "IDC_PARTY_HEAL", wxCheckBox)->
00479         SetValue(saveslot->hasMagic(HEAL));
00480     XRCCTRL(*this, "IDC_PARTY_FIRE", wxCheckBox)->
00481         SetValue(saveslot->hasMagic(FIRE));
00482     XRCCTRL(*this, "IDC_PARTY_EXIT", wxCheckBox)->
00483         SetValue(saveslot->hasMagic(EXIT));
00484     XRCCTRL(*this, "IDC_PARTY_DISPEL", wxCheckBox)->
00485         SetValue(saveslot->hasMagic(DISPEL));
00486     XRCCTRL(*this, "IDC_PARTY_VIEW", wxCheckBox)->
00487         SetValue(saveslot->hasMagic(VIEW));
00488     XRCCTRL(*this, "IDC_PARTY_PROTECT", wxCheckBox)->
00489         SetValue(saveslot->hasMagic(PROTECT));
00490     XRCCTRL(*this, "IDC_PARTY_ICE", wxCheckBox)->
00491         SetValue(saveslot->hasMagic(ICE));
00492     XRCCTRL(*this, "IDC_PARTY_BLINK", wxCheckBox)->
00493         SetValue(saveslot->hasMagic(BLINK));
00494     XRCCTRL(*this, "IDC_PARTY_ENERGY", wxCheckBox)->
00495         SetValue(saveslot->hasMagic(ENERGY));
00496     XRCCTRL(*this, "IDC_PARTY_QUICK", wxCheckBox)->
00497         SetValue(saveslot->hasMagic(QUICK));
00498     XRCCTRL(*this, "IDC_PARTY_SLEEP", wxCheckBox)->
00499         SetValue(saveslot->hasMagic(SLEEP));
00500     XRCCTRL(*this, "IDC_PARTY_REFLECT", wxCheckBox)->
00501         SetValue(saveslot->hasMagic(REFLECT));
00502     XRCCTRL(*this, "IDC_PARTY_NEGATE", wxCheckBox)->
00503         SetValue(saveslot->hasMagic(NEGATE));
00504     XRCCTRL(*this, "IDC_PARTY_DESTROY", wxCheckBox)->
00505         SetValue(saveslot->hasMagic(DESTROY));
00506     XRCCTRL(*this, "IDC_PARTY_JINX", wxCheckBox)->
00507         SetValue(saveslot->hasMagic(JINX));
00508     XRCCTRL(*this, "IDC_PARTY_SQUISH", wxCheckBox)->
00509         SetValue(saveslot->hasMagic(SQUISH));
00510     XRCCTRL(*this, "IDC_PARTY_GATE", wxCheckBox)->
00511         SetValue(saveslot->hasMagic(GATE));
00512     XRCCTRL(*this, "IDC_PARTY_TREMOR", wxCheckBox)->
00513         SetValue(saveslot->hasMagic(TREMOR));
00514     XRCCTRL(*this, "IDC_PARTY_LIFE", wxCheckBox)->
00515         SetValue(saveslot->hasMagic(LIFE));
00516     XRCCTRL(*this, "IDC_PARTY_DEFEAT", wxCheckBox)->
00517         SetValue(saveslot->hasMagic(DEFEAT));
00518         
00519     // load herb inventory
00520     XRCCTRL(*this, "IDS_INVENTORY_ASH", wxSlider)->
00521         SetValue(saveslot->getHerb(ASH));
00522     XRCCTRL(*this, "IDS_INVENTORY_GINSENG", wxSlider)->
00523         SetValue(saveslot->getHerb(GINSENG));
00524     XRCCTRL(*this, "IDS_INVENTORY_GARLIC", wxSlider)->
00525         SetValue(saveslot->getHerb(GARLIC));
00526     XRCCTRL(*this, "IDS_INVENTORY_SILKWEB", wxSlider)->
00527         SetValue(saveslot->getHerb(SILKWEB));
00528     XRCCTRL(*this, "IDS_INVENTORY_MOSS", wxSlider)->
00529         SetValue(saveslot->getHerb(MOSS));
00530     XRCCTRL(*this, "IDS_INVENTORY_PEARL", wxSlider)->
00531         SetValue(saveslot->getHerb(PEARL));
00532     XRCCTRL(*this, "IDS_INVENTORY_FUNGUS", wxSlider)->
00533         SetValue(saveslot->getHerb(FUNGUS));
00534     XRCCTRL(*this, "IDS_INVENTORY_MANROOT", wxSlider)->
00535         SetValue(saveslot->getHerb(MANROOT));
00536         
00537     // load rune inventory
00538     XRCCTRL(*this, "IDC_INVENTORY_HONESTY", wxCheckBox)->
00539         SetValue(saveslot->hasRune(HONESTY));
00540     XRCCTRL(*this, "IDC_INVENTORY_COMPASSION", wxCheckBox)->
00541         SetValue(saveslot->hasRune(COMPASSION));
00542     XRCCTRL(*this, "IDC_INVENTORY_VALOR", wxCheckBox)->
00543         SetValue(saveslot->hasRune(VALOR));
00544     XRCCTRL(*this, "IDC_INVENTORY_JUSTICE", wxCheckBox)->
00545         SetValue(saveslot->hasRune(JUSTICE));
00546     XRCCTRL(*this, "IDC_INVENTORY_SACRIFICE", wxCheckBox)->
00547         SetValue(saveslot->hasRune(SACRIFICE));
00548     XRCCTRL(*this, "IDC_INVENTORY_HONOR", wxCheckBox)->
00549         SetValue(saveslot->hasRune(HONOR));
00550     XRCCTRL(*this, "IDC_INVENTORY_SPIRITUALITY", wxCheckBox)->
00551         SetValue(saveslot->hasRune(SPIRITUALITY));
00552     XRCCTRL(*this, "IDC_INVENTORY_HUMILITY", wxCheckBox)->
00553         SetValue(saveslot->hasRune(HUMILITY));
00554         
00555     // load stone inventory
00556     XRCCTRL(*this, "IDC_INVENTORY_BLUE", wxCheckBox)->
00557         SetValue(saveslot->hasStone(HONESTY));
00558     XRCCTRL(*this, "IDC_INVENTORY_YELLOW", wxCheckBox)->
00559         SetValue(saveslot->hasStone(COMPASSION));
00560     XRCCTRL(*this, "IDC_INVENTORY_RED", wxCheckBox)->
00561         SetValue(saveslot->hasStone(VALOR));
00562     XRCCTRL(*this, "IDC_INVENTORY_GREEN", wxCheckBox)->
00563         SetValue(saveslot->hasStone(JUSTICE));
00564     XRCCTRL(*this, "IDC_INVENTORY_ORANGE", wxCheckBox)->
00565         SetValue(saveslot->hasStone(SACRIFICE));
00566     XRCCTRL(*this, "IDC_INVENTORY_PURPLE", wxCheckBox)->
00567         SetValue(saveslot->hasStone(HONOR));
00568     XRCCTRL(*this, "IDC_INVENTORY_WHITE", wxCheckBox)->
00569         SetValue(saveslot->hasStone(SPIRITUALITY));
00570     XRCCTRL(*this, "IDC_INVENTORY_BLACK", wxCheckBox)->
00571         SetValue(saveslot->hasStone(HUMILITY));
00572         
00573     // load tool inventory
00574     XRCCTRL(*this, "IDS_INVENTORY_TORCH", wxSlider)->
00575         SetValue(saveslot->getTool(TORCH));
00576     XRCCTRL(*this, "IDS_INVENTORY_GEM", wxSlider)->
00577         SetValue(saveslot->getTool(GEM));
00578     XRCCTRL(*this, "IDS_INVENTORY_OIL", wxSlider)->
00579         SetValue(saveslot->getTool(OIL));
00580         
00581     XRCCTRL(*this, "IDC_INVENTORY_KEY", wxCheckBox)->
00582         SetValue(saveslot->getTool(KEY));
00583     XRCCTRL(*this, "IDC_INVENTORY_SEXTANT", wxCheckBox)->
00584         SetValue(saveslot->getTool(SEXTANT));
00585     XRCCTRL(*this, "IDC_INVENTORY_SCALE", wxCheckBox)->
00586         SetValue(saveslot->getTool(SCALE));
00587     XRCCTRL(*this, "IDC_INVENTORY_FLUTE", wxCheckBox)->
00588         SetValue(saveslot->getTool(FLUTE));
00589     XRCCTRL(*this, "IDC_INVENTORY_CANDLE", wxCheckBox)->
00590         SetValue(saveslot->getTool(CANDLE));
00591     XRCCTRL(*this, "IDC_INVENTORY_BOOK", wxCheckBox)->
00592         SetValue(saveslot->getTool(BOOK));
00593     XRCCTRL(*this, "IDC_INVENTORY_BELL", wxCheckBox)->
00594         SetValue(saveslot->getTool(BELL));
00595     XRCCTRL(*this, "IDC_INVENTORY_HORN", wxCheckBox)->
00596         SetValue(saveslot->getTool(HORN));
00597     XRCCTRL(*this, "IDC_INVENTORY_SKULL", wxCheckBox)->
00598         SetValue(saveslot->getTool(SKULL));
00599     XRCCTRL(*this, "IDC_INVENTORY_TRUTHKEY", wxCheckBox)->
00600         SetValue(saveslot->getTool(TRUTHKEY));
00601     XRCCTRL(*this, "IDC_INVENTORY_LOVEKEY", wxCheckBox)->
00602         SetValue(saveslot->getTool(LOVEKEY));
00603     XRCCTRL(*this, "IDC_INVENTORY_COURAGEKEY", wxCheckBox)->
00604         SetValue(saveslot->getTool(COURAGEKEY));
00605     XRCCTRL(*this, "IDC_INVENTORY_WHEEL", wxCheckBox)->
00606         SetValue(saveslot->getTool(WHEEL));
00607         
00608     // load moongates
00609     XRCCTRL(*this, "IDC_TRANSPORTATION_TRAMMEL", wxChoice)->
00610         SetSelection(saveslot->getPhase(TRAMMEL));
00611     setFeluccaOptions(static_cast<enum City>(saveslot->getPhase(TRAMMEL)));
00612     XRCCTRL(*this, "IDC_TRANSPORTATION_FELUCCA", wxChoice)->
00613         SetSelection(saveslot->getPhase(FELUCCA));
00614         
00615     // load Balloon location
00616     std::pair<int, int> balloon = saveslot->getBalloonLocation();
00617     XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLATITUDE", wxTextCtrl)->
00618         SetValue(wxString::Format(wxT("%d"), balloon.first));
00619     XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLONGITUDE", wxTextCtrl)->
00620         SetValue(wxString::Format(wxT("%d"), balloon.second));
00621         
00622     // load Whirlpool location
00623     std::pair<int, int> whirlpool = saveslot->getWhirlpoolLocation();
00624     XRCCTRL(*this, "IDT_TRANSPORTATION_WHIRLPOOLLATITUDE", wxTextCtrl)->
00625         SetValue(wxString::Format(wxT("%d"), whirlpool.first));
00626     XRCCTRL(*this, "IDT_TRANSPORTATION_WHIRLPOOLLONGITUDE", wxTextCtrl)->
00627         SetValue(wxString::Format(wxT("%d"), whirlpool.second));
00628         
00629     // load pirate ship locations
00630     XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP1", wxCheckBox)->
00631         SetValue(saveslot->hasPirateShip(SHIP1));
00632     XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP2", wxCheckBox)->
00633         SetValue(saveslot->hasPirateShip(SHIP2));
00634     XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP3", wxCheckBox)->
00635         SetValue(saveslot->hasPirateShip(SHIP3));
00636     XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP4", wxCheckBox)->
00637         SetValue(saveslot->hasPirateShip(SHIP4));
00638         
00639     std::pair<int, int> ship = saveslot->getPirateShipLocation(SHIP1);
00640     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LATITUDE", wxTextCtrl)->
00641         SetValue(wxString::Format(wxT("%d"), ship.first));
00642     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LONGITUDE", wxTextCtrl)->
00643         SetValue(wxString::Format(wxT("%d"), ship.second));
00644         
00645     ship = saveslot->getPirateShipLocation(SHIP2);
00646     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LATITUDE", wxTextCtrl)->
00647         SetValue(wxString::Format(wxT("%d"), ship.first));
00648     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LONGITUDE", wxTextCtrl)->
00649         SetValue(wxString::Format(wxT("%d"), ship.second));
00650         
00651     ship = saveslot->getPirateShipLocation(SHIP3);
00652     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LATITUDE", wxTextCtrl)->
00653         SetValue(wxString::Format(wxT("%d"), ship.first));
00654     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LONGITUDE", wxTextCtrl)->
00655         SetValue(wxString::Format(wxT("%d"), ship.second));
00656         
00657     ship = saveslot->getPirateShipLocation(SHIP4);
00658     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LATITUDE", wxTextCtrl)->
00659         SetValue(wxString::Format(wxT("%d"), ship.first));
00660     XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LONGITUDE", wxTextCtrl)->
00661         SetValue(wxString::Format(wxT("%d"), ship.second));
00662         
00663     // load character stats
00664     loadStats(static_cast<enum Character>(
00665         XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection()));
00666                       
00667     // show the notebook
00668     wxNotebook *notebook = XRCCTRL(*this, "IDN_HACK4U", wxNotebook);
00669     notebook->SetSelection(0);
00670     notebook->Show(true);
00671     
00672     ignoreEvents = false;
00673 }
00674 
00675 void MainFrame::loadStats(enum Character character) {
00676     // ignore events we're about to generate
00677     ignoreEvents = true;
00678     
00679     XRCCTRL(*this, "IDT_CHARACTER_LEVEL", wxTextCtrl)->
00680         SetValue(wxString::Format(wxT("%d"), saveslot->getLevel(character)));
00681     XRCCTRL(*this, "IDT_CHARACTER_HP", wxTextCtrl)->
00682         SetValue(wxString::Format(wxT("%d"),
00683                  saveslot->getCurrentHP(character)));
00684     XRCCTRL(*this, "IDT_CHARACTER_MP", wxTextCtrl)->
00685         SetValue(wxString::Format(wxT("%d"),
00686                  saveslot->getCurrentMP(character)));
00687     XRCCTRL(*this, "IDT_CHARACTER_EXPERIENCE", wxTextCtrl)->
00688         SetValue(wxString::Format(wxT("%d"),
00689                  saveslot->getExperience(character)));
00690     XRCCTRL(*this, "IDT_CHARACTER_MAXHP", wxTextCtrl)->
00691         SetValue(wxString::Format(wxT("%d"), saveslot->getMaxHP(character)));
00692     XRCCTRL(*this, "IDT_CHARACTER_MAXMP", wxTextCtrl)->
00693         SetValue(wxString::Format(wxT("%d"), saveslot->getMaxMP(character)));
00694     XRCCTRL(*this, "IDT_CHARACTER_STRENGTH", wxTextCtrl)->
00695         SetValue(wxString::Format(wxT("%d"), saveslot->getStrength(character)));
00696     XRCCTRL(*this, "IDT_CHARACTER_INTELLIGENCE", wxTextCtrl)->
00697         SetValue(wxString::Format(wxT("%d"),
00698                  saveslot->getIntelligence(character)));
00699     XRCCTRL(*this, "IDT_CHARACTER_DEXTERITY", wxTextCtrl)->
00700         SetValue(wxString::Format(wxT("%d"),
00701                  saveslot->getDexterity(character)));
00702                  
00703     for (int index = 0; index < 6; ++index) {
00704         int item = saveslot->getEquipment(character, index);
00705         
00706         itemChoice[index]->SetSelection(item & 0x7F);
00707         itemEquippedCheck[index]->SetValue(item & 0x80);
00708     }
00709     
00710     ignoreEvents = false;
00711 }
00712 
00713 bool MainFrame::save(const wxString &filename) {
00714     if (!isValidParty()) {
00715         int choice = wxMessageBox(wxT("Duplicate or missing party members"
00716                                       " selected.\nContinue Saving?"),
00717                                   wxT("Warning: Invalid Party"),
00718                                   wxYES_NO | wxICON_QUESTION,
00719                                   this);
00720                                  
00721         if (choice != wxYES) {
00722             return false;
00723         }
00724     }
00725     
00726     for (int character = MAGE; character < SHEPHERD; ++character) {
00727         if (!hasValidEquipment(static_cast<enum Character>(character))) {
00728             int choice = wxMessageBox(CHARACTER_NAMES[character] + 
00729                                       wxT(" has more than one equipped item of "
00730                                           "the same type.\nContinue Saving?"),
00731                                       wxT("Warning: Invalid Equipment"),
00732                                       wxYES_NO | wxICON_QUESTION,
00733                                       this);
00734                                       
00735             if (choice != wxYES) {
00736                 return false;
00737             }
00738         }
00739     }
00740     
00741     try {
00742         sram->save(filename);
00743     } catch (FileIOException &e) {
00744         if (e.getError() == FIE_CANNOTOPEN) {
00745             wxMessageBox(wxT("Unable to open the SRAM file."),
00746                          wxT("File Open Error"), wxOK | wxICON_ERROR);
00747                          
00748             return false;
00749         } else {
00750             // we must be an FIE_IOERROR
00751             wxASSERT(e.getError() == FIE_IOERROR);
00752             
00753             wxMessageBox(wxT("Unable to write to the SRAM file."),
00754                          wxT("File I/O error"), wxOK | wxICON_ERROR);
00755             
00756             return false;
00757         }
00758     }
00759     
00760     return true;
00761 }
00762 
00763 void MainFrame::onBalloonChange(wxCommandEvent &event) {
00764     if (ignoreEvents) {
00765         return;
00766     }
00767     
00768     wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
00769     int value = std::atoi(ctrl->GetValue().mb_str());
00770     std::pair<int, int> location = saveslot->getBalloonLocation();
00771     
00772     if (event.GetId() == XRCID("IDT_TRANSPORTATION_BALLOONLATITUDE")) {
00773         location.first = value;
00774     } else {
00775         // we must be longitude if we're here
00776         wxASSERT(event.GetId() == XRCID("IDT_TRANSPORTATION_BALLOONLONGITUDE"));
00777         
00778         location.second = value;
00779     }
00780     
00781     saveslot->setBalloonLocation(location);
00782 }
00783 
00784 void MainFrame::onEquipmentChange(wxCommandEvent &event) {
00785     wxChoice *ctrl = dynamic_cast<wxChoice *>(event.GetEventObject());
00786     int slot;
00787     
00788     for (slot = 0; slot < 6; ++slot) {
00789         if (ctrl == itemChoice[slot]) {
00790             break;
00791         }
00792     }
00793     
00794     setEquipment(slot);
00795 }
00796 
00797 void MainFrame::onEquippedChange(wxCommandEvent &event) {
00798     wxCheckBox *ctrl = dynamic_cast<wxCheckBox *>(event.GetEventObject());
00799     int slot;
00800     
00801     for (slot = 0; slot < 6; ++slot) {
00802         if (ctrl == itemEquippedCheck[slot]) {
00803             break;
00804         }
00805     }
00806     
00807     setEquipment(slot);
00808 }
00809 
00810 void MainFrame::onEquippedUpdate(wxUpdateUIEvent &event) {
00811     if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED1")) {
00812         event.Enable(itemChoice[0]->GetSelection() > 0);
00813         
00814         if (itemChoice[0]->GetSelection() == 0) {
00815             event.Check(false);
00816         }
00817     } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED2")) {
00818         event.Enable(itemChoice[1]->GetSelection() > 0);
00819         
00820         if (itemChoice[1]->GetSelection() == 0) {
00821             event.Check(false);
00822         }
00823     } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED3")) {
00824         event.Enable(itemChoice[2]->GetSelection() > 0);
00825         
00826         if (itemChoice[2]->GetSelection() == 0) {
00827             event.Check(false);
00828         }
00829     } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED4")) {
00830         event.Enable(itemChoice[3]->GetSelection() > 0);
00831         
00832         if (itemChoice[3]->GetSelection() == 0) {
00833             event.Check(false);
00834         }
00835     } else if (event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED5")) {
00836         event.Enable(itemChoice[4]->GetSelection() > 0);
00837         
00838         if (itemChoice[4]->GetSelection() == 0) {
00839             event.Check(false);
00840         }
00841     } else {
00842         // we must be the last box if we're here
00843         wxASSERT(event.GetId() == XRCID("IDC_CHARACTER_EQUIPPED6"));
00844         
00845         event.Enable(itemChoice[5]->GetSelection() > 0);
00846         
00847         if (itemChoice[5]->GetSelection() == 0) {
00848             event.Check(false);
00849         }
00850     }
00851 }
00852 
00853 void MainFrame::onFileExit(wxCommandEvent &) {
00854     if (isOpen()) {
00855         if (close()) {
00856             Close(true);
00857         }
00858     } else {
00859         Close(true);
00860     }
00861 }
00862 
00863 void MainFrame::onFileOpen(wxCommandEvent &) {
00864     static wxFileDialog *dlg = new wxFileDialog(this, 
00865         wxT("Choose a .SAV File"), wxT(""), wxT(""), 
00866         wxT("NES SRAM File (*.sav)|*.sav"), (wxOPEN | wxCHANGE_DIR));
00867         
00868     int value = dlg->ShowModal();
00869     
00870     if (value == wxID_OK) {
00871         sramFile = dlg->GetPath();
00872         load(sramFile);
00873     }
00874 }
00875 
00876 void MainFrame::onFileSaveAs(wxCommandEvent &) {
00877     static wxFileDialog *dlg = new wxFileDialog(this, 
00878         wxT("Choose a .SAV File"), wxT(""), wxT(""), 
00879         wxT("NES SRAM File (*.sav)|*.sav"), (wxSAVE | wxCHANGE_DIR));
00880     
00881     int value = dlg->ShowModal();
00882     
00883     if (value == wxID_OK) {
00884         sramFile = dlg->GetPath();
00885         save(sramFile);
00886     }
00887 }
00888 
00889 void MainFrame::onGameChange(wxCommandEvent &event) {
00890     if (event.GetId() == XRCID("IDM_GAME_GAME1")) {
00891         loadGame(0);
00892     } else if (event.GetId() == XRCID("IDM_GAME_GAME2")) {
00893         loadGame(1);
00894     } else if (event.GetId() == XRCID("IDM_GAME_GAME3")) {
00895         loadGame(2);
00896     }
00897 }
00898 
00899 void MainFrame::onGameMenuUpdate(wxUpdateUIEvent &event) {
00900     if (isOpen()) {
00901         if (event.GetId() == XRCID("IDM_GAME_GAME1")) {
00902             event.Enable(sram->isValid(0));
00903         } else if (event.GetId() == XRCID("IDM_GAME_GAME2")) {
00904             event.Enable(sram->isValid(1));
00905         } else {
00906             // we must be game 3 if we're here
00907             wxASSERT(event.GetId() == XRCID("IDM_GAME_GAME3"));
00908             
00909             event.Enable(sram->isValid(2));
00910         }
00911     } else {
00912         event.Enable(false);
00913     }
00914 }
00915 
00916 void MainFrame::onGoldChange(wxCommandEvent &) {
00917     if (ignoreEvents) {
00918         return;
00919     }
00920     
00921     saveslot->setGold(std::atoi(XRCCTRL(*this, 
00922                                         "IDT_PARTY_GOLD",
00923                                         wxTextCtrl)->GetValue().mb_str()));
00924 }
00925 
00926 void MainFrame::onHelpAbout(wxCommandEvent &) {
00927     wxMessageDialog dlg(this, *Hack4u::APP_NAME + wxT(' ') + 
00928                         *Hack4u::APP_VERSION + wxT('\n') +
00929                         *Hack4u::APP_COPYRIGHT + wxT('\n') +
00930                         *Hack4u::APP_URL, wxT("About ") + 
00931                         *Hack4u::APP_NAME + wxT("..."),
00932                         wxOK | wxICON_INFORMATION);
00933     dlg.ShowModal();
00934 }
00935 
00936 void MainFrame::onHerbChange(wxScrollEvent &event) {
00937     enum Herb herb = MANROOT;
00938     
00939     if (event.GetId() == XRCID("IDS_INVENTORY_ASH")) {
00940         herb = ASH;
00941     } else if (event.GetId() == XRCID("IDS_INVENTORY_GINSENG")) {
00942         herb = GINSENG;
00943     } else if (event.GetId() == XRCID("IDS_INVENTORY_GARLIC")) {
00944         herb = GARLIC;
00945     } else if (event.GetId() == XRCID("IDS_INVENTORY_SILKWEB")) {
00946         herb = SILKWEB;
00947     } else if (event.GetId() == XRCID("IDS_INVENTORY_MOSS")) {
00948         herb = MOSS;
00949     } else if (event.GetId() == XRCID("IDS_INVENTORY_PEARL")) {
00950         herb = PEARL;
00951     } else if (event.GetId() == XRCID("IDS_INVENTORY_FUNGUS")) {
00952         herb = FUNGUS;
00953     }
00954     
00955     saveslot->setHerb(herb, event.GetPosition());
00956 }
00957 
00958 void MainFrame::onHerosNameChange(wxCommandEvent &) {
00959     if (ignoreEvents) {
00960         return;
00961     }
00962     
00963     saveslot->setHerosName(XRCCTRL(*this,
00964                                    "IDT_HERO_NAME",
00965                                    wxTextCtrl)->GetValue());
00966 }
00967 
00968 void MainFrame::onJoinedChange(wxCommandEvent &event) {
00969     if (event.GetId() == XRCID("IDC_PARTY_MAGE")) {
00970         saveslot->setJoined(MAGE, event.IsChecked());
00971     } else if (event.GetId() == XRCID("IDC_PARTY_BARD")) {
00972         saveslot->setJoined(BARD, event.IsChecked());
00973     } else if (event.GetId() == XRCID("IDC_PARTY_FIGHTER")) {
00974         saveslot->setJoined(FIGHTER, event.IsChecked());
00975     } else if (event.GetId() == XRCID("IDC_PARTY_DRUID")) {
00976         saveslot->setJoined(DRUID, event.IsChecked());
00977     } else if (event.GetId() == XRCID("IDC_PARTY_TINKER")) {
00978         saveslot->setJoined(TINKER, event.IsChecked());
00979     } else if (event.GetId() == XRCID("IDC_PARTY_PALADIN")) {
00980         saveslot->setJoined(PALADIN, event.IsChecked());
00981     } else if (event.GetId() == XRCID("IDC_PARTY_RANGER")) {
00982         saveslot->setJoined(RANGER, event.IsChecked());
00983     } else {
00984         // we must be shepherd if we're here
00985         wxASSERT(event.GetId() == XRCID("IDC_PARTY_SHEPHERD"));
00986         
00987         saveslot->setJoined(SHEPHERD, event.IsChecked());
00988     }
00989 }
00990 
00991 void MainFrame::onLocationBalloon(wxCommandEvent &) {
00992     const std::pair<int, int> &balloon = BALLOON_LOCATIONS[location];
00993     
00994     XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLATITUDE", wxTextCtrl)->
00995         SetValue(wxString::Format(wxT("%d"), balloon.first));
00996     XRCCTRL(*this, "IDT_TRANSPORTATION_BALLOONLONGITUDE", wxTextCtrl)->
00997         SetValue(wxString::Format(wxT("%d"), balloon.second));
00998 }
00999 
01000 void MainFrame::onLocationPlaceChange(wxCommandEvent &event) {
01001     if (event.GetId() == XRCID("IDM_LOCATION_PLACE_MOONGLOW")) {
01002         location = LMOONGLOW;
01003     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_BRITAIN")) {
01004         location = LBRITAIN;
01005     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_JHELOM")) {
01006         location = LJHELOM;
01007     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_YEW")) {
01008         location = LYEW;
01009     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_MINOC")) {
01010         location = LMINOC;
01011     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_TRINSIC")) {
01012         location = LTRINSIC;
01013     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_SKARABRAE")) {
01014         location = LSKARABRAE;
01015     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_MAGINCIA")) {
01016         location = LMAGINCIA;
01017     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_LYCAEUM")) {
01018         location = LLYCAEUM;
01019     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_EMPATHABBEY")) {
01020         location = LEMPATHABBEY;
01021     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_SERPENTSHOLD")) {
01022         location = LSERPENTSHOLD;
01023     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_PAWS")) {
01024         location = LPAWS;
01025     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_VESPER")) {
01026         location = LVESPER;
01027     } else if (event.GetId() == XRCID("IDM_LOCATION_PLACE_BUCCANEERSDEN")) {
01028         location = LBUCCANEERSDEN;
01029     } else {
01030         // we must be Cove if we're here
01031         wxASSERT(event.GetId() == XRCID("IDM_LOCATION_PLACE_COVE"));
01032         
01033         location = LCOVE;
01034     }
01035 }
01036 
01037 void MainFrame::onLocationShip(wxCommandEvent &event) {
01038     wxCheckBox *check;
01039     wxTextCtrl *latitude, *longitude;
01040     enum PirateShip ship;
01041     
01042     if (event.GetId() == XRCID("IDM_LOCATION_SHIP1")) {
01043         ship = SHIP1;
01044         check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP1", wxCheckBox);
01045         latitude =
01046             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LATITUDE", wxTextCtrl);
01047         longitude =
01048             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP1LONGITUDE", wxTextCtrl);
01049     } else if (event.GetId() == XRCID("IDM_LOCATION_SHIP2")) {
01050         ship = SHIP2;
01051         check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP2", wxCheckBox);
01052         latitude =
01053             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LATITUDE", wxTextCtrl);
01054         longitude =
01055             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP2LONGITUDE", wxTextCtrl);
01056     } else if (event.GetId() == XRCID("IDM_LOCATION_SHIP3")) {
01057         ship = SHIP3;
01058         check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP3", wxCheckBox);
01059         latitude =
01060             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LATITUDE", wxTextCtrl);
01061         longitude =
01062             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP3LONGITUDE", wxTextCtrl);
01063     } else {
01064         // we must be ship 4 if we're here
01065         wxASSERT(event.GetId() == XRCID("IDM_LOCATION_SHIP4"));
01066         
01067         ship = SHIP4;
01068         check = XRCCTRL(*this, "IDC_TRANSPORTATION_SHIP4", wxCheckBox);
01069         latitude =
01070             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LATITUDE", wxTextCtrl);
01071         longitude =
01072             XRCCTRL(*this, "IDT_TRANSPORTATION_SHIP4LONGITUDE", wxTextCtrl);
01073     }
01074     
01075     const std::pair<int, int> &loc = PIRATESHIP_LOCATIONS[location];
01076     
01077     check->SetValue(true);
01078     latitude->SetValue(wxString::Format(wxT("%d"), loc.first));
01079     longitude->SetValue(wxString::Format(wxT("%d"), loc.second));
01080     
01081     saveslot->setPirateShip(ship, true);
01082 }
01083 
01084 void MainFrame::onMagicChange(wxCommandEvent &event) {
01085     enum Magic magic = DEFEAT;
01086     
01087     if (event.GetId() == XRCID("IDC_PARTY_LIGHT")) {
01088         magic = LIGHT;
01089     } else if (event.GetId() == XRCID("IDC_PARTY_MISSILE")) {
01090         magic = MISSILE;
01091     } else if (event.GetId() == XRCID("IDC_PARTY_AWAKEN")) {
01092         magic = AWAKEN;
01093     } else if (event.GetId() == XRCID("IDC_PARTY_CURE")) {
01094         magic = CURE;
01095     } else if (event.GetId() == XRCID("IDC_PARTY_WIND")) {
01096         magic = WIND;
01097     } else if (event.GetId() == XRCID("IDC_PARTY_HEAL")) {
01098         magic = HEAL;
01099     } else if (event.GetId() == XRCID("IDC_PARTY_FIRE")) {
01100         magic = FIRE;
01101     } else if (event.GetId() == XRCID("IDC_PARTY_EXIT")) {
01102         magic = EXIT;
01103     } else if (event.GetId() == XRCID("IDC_PARTY_DISPEL")) {
01104         magic = DISPEL;
01105     } else if (event.GetId() == XRCID("IDC_PARTY_VIEW")) {
01106         magic = VIEW;
01107     } else if (event.GetId() == XRCID("IDC_PARTY_PROTECT")) {
01108         magic = PROTECT;
01109     } else if (event.GetId() == XRCID("IDC_PARTY_ICE")) {
01110         magic = ICE;
01111     } else if (event.GetId() == XRCID("IDC_PARTY_BLINK")) {
01112         magic = BLINK;
01113     } else if (event.GetId() == XRCID("IDC_PARTY_ENERGY")) {
01114         magic = ENERGY;
01115     } else if (event.GetId() == XRCID("IDC_PARTY_QUICK")) {
01116         magic = QUICK;
01117     } else if (event.GetId() == XRCID("IDC_PARTY_SLEEP")) {
01118         magic = SLEEP;
01119     } else if (event.GetId() == XRCID("IDC_PARTY_REFLECT")) {
01120         magic = REFLECT;
01121     } else if (event.GetId() == XRCID("IDC_PARTY_NEGATE")) {
01122         magic = NEGATE;
01123     } else if (event.GetId() == XRCID("IDC_PARTY_DESTROY")) {
01124         magic = DESTROY;
01125     } else if (event.GetId() == XRCID("IDC_PARTY_JINX")) {
01126         magic = JINX;
01127     } else if (event.GetId() == XRCID("IDC_PARTY_SQUISH")) {
01128         magic = SQUISH;
01129     } else if (event.GetId() == XRCID("IDC_PARTY_GATE")) {
01130         magic = GATE;
01131     } else if (event.GetId() == XRCID("IDC_PARTY_TREMOR")) {
01132         magic = TREMOR;
01133     } else if (event.GetId() == XRCID("IDC_PARTY_LIFE")) {
01134         magic = LIFE;
01135     }
01136     
01137     saveslot->setMagic(magic, event.IsChecked());
01138 }
01139 
01140 void MainFrame::onMemberClassChange(wxCommandEvent &event) {
01141     int character = event.GetSelection();
01142     int member = 3;
01143     
01144     if (event.GetId() == XRCID("IDC_PARTY_MEMBER1")) {
01145         member = 0;
01146     } else if (event.GetId() == XRCID("IDC_PARTY_MEMBER2")) {
01147         member = 1;
01148         
01149         if (character == 0) {
01150             // remove subsequent members
01151             wxCommandEvent evt(wxEVT_COMMAND_CHOICE_SELECTED,
01152                                XRCID("IDC_PARTY_MEMBER3"));
01153             evt.SetEventObject(memberChoice[2]);
01154             evt.SetInt(0);
01155             AddPendingEvent(evt);
01156             
01157             memberChoice[2]->SetSelection(0);
01158         }
01159     } else if (event.GetId() == XRCID("IDC_PARTY_MEMBER3")) {
01160         member = 2;
01161         
01162         if (character == 0) {
01163             // remove subsequent members
01164             wxCommandEvent evt(wxEVT_COMMAND_CHOICE_SELECTED,
01165                                XRCID("IDC_PARTY_MEMBER4"));
01166             evt.SetEventObject(memberChoice[3]);
01167             evt.SetInt(0);
01168             AddPendingEvent(evt);
01169             
01170             memberChoice[3]->SetSelection(0);
01171         }
01172     }
01173     
01174     saveslot->setMember(member, ((member == 0) ? 
01175                                               (character + 1) : character));
01176 }
01177 
01178 void MainFrame::onMemberUpdate(wxUpdateUIEvent &event) {
01179     if (event.GetId() == XRCID("IDC_PARTY_MEMBER3")) {
01180         event.Enable(memberChoice[1]->GetSelection() > 0);
01181     } else {
01182         // we must be 4 if we're here
01183         wxASSERT(event.GetId() == XRCID("IDC_PARTY_MEMBER4"));
01184         
01185         event.Enable(memberChoice[2]->GetSelection() > 0);
01186     }
01187 }
01188 
01189 void MainFrame::onPhaseChange(wxCommandEvent &event) {
01190     enum City trammel;
01191     int felucca;
01192     
01193     if (event.GetId() == XRCID("IDC_TRANSPORTATION_TRAMMEL")) {
01194         trammel = static_cast<enum City>(event.GetSelection());
01195         setFeluccaOptions(trammel);
01196     } else {
01197         trammel = static_cast<enum City>
01198             (XRCCTRL(*this,
01199                      "IDC_TRANSPORTATION_TRAMMEL",
01200                      wxChoice)->GetSelection());
01201     }
01202     
01203     felucca =
01204         XRCCTRL(*this, "IDC_TRANSPORTATION_FELUCCA", wxChoice)->GetSelection();
01205     saveslot->setPhase(trammel, felucca);
01206 }
01207 
01208 void MainFrame::onRuneChange(wxCommandEvent &event) {
01209     enum Virtue rune = HUMILITY;
01210     
01211     if (event.GetId() == XRCID("IDC_INVENTORY_HONESTY")) {
01212         rune = HONESTY;
01213     } else if (event.GetId() == XRCID("IDC_INVENTORY_COMPASSION")) {
01214         rune = COMPASSION;
01215     } else if (event.GetId() == XRCID("IDC_INVENTORY_VALOR")) {
01216         rune = VALOR;
01217     } else if (event.GetId() == XRCID("IDC_INVENTORY_JUSTICE")) {
01218         rune = JUSTICE;
01219     } else if (event.GetId() == XRCID("IDC_INVENTORY_SACRIFICE")) {
01220         rune = SACRIFICE;
01221     } else if (event.GetId() == XRCID("IDC_INVENTORY_HONOR")) {
01222         rune = HONOR;
01223     } else if (event.GetId() == XRCID("IDC_INVENTORY_SPIRITUALITY")) {
01224         rune = SPIRITUALITY;
01225     }
01226     
01227     saveslot->setRune(rune, event.IsChecked());
01228 }
01229 
01230 void MainFrame::onSaveUpdate(wxUpdateUIEvent &event) {
01231     // no need to save unless we have an open modified game
01232     event.Enable(isOpen() &&
01233         (sram->getSaveSlot(0)->isModified() ||
01234          sram->getSaveSlot(1)->isModified() ||
01235          sram->getSaveSlot(2)->isModified()));
01236 }
01237 
01238 void MainFrame::onShipChange(wxCommandEvent &event) {
01239     enum PirateShip ship;
01240     
01241     if (event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP1")) {
01242         ship = SHIP1;
01243     } else if (event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP2")) {
01244         ship = SHIP2;
01245     } else if (event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP3")) {
01246         ship = SHIP3;
01247     } else {
01248         // we must be the last ship if we're here
01249         wxASSERT(event.GetId() == XRCID("IDC_TRANSPORTATION_SHIP4"));
01250         
01251         ship = SHIP4;
01252     }
01253     
01254     saveslot->setPirateShip(ship, event.IsChecked());
01255 }
01256 
01257 void MainFrame::onShipLocationChange(wxCommandEvent &event) {
01258     if (ignoreEvents) {
01259         return;
01260     }
01261     
01262     wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
01263     int value = std::atoi(ctrl->GetValue().mb_str());
01264     enum PirateShip ship;
01265     std::pair<int, int> location;
01266     
01267     if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE")) {
01268         ship = SHIP1;
01269         location = saveslot->getPirateShipLocation(ship);
01270         location.first = value;
01271     } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE")) {
01272         ship = SHIP2;
01273         location = saveslot->getPirateShipLocation(ship);
01274         location.first = value;
01275     } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE")) {
01276         ship = SHIP3;
01277         location = saveslot->getPirateShipLocation(ship);
01278         location.first = value;
01279     } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE")) {
01280         ship = SHIP4;
01281         location = saveslot->getPirateShipLocation(ship);
01282         location.first = value;
01283     } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE")) {
01284         ship = SHIP1;
01285         location = saveslot->getPirateShipLocation(ship);
01286         location.second = value;
01287     } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE")) {
01288         ship = SHIP2;
01289         location = saveslot->getPirateShipLocation(ship);
01290         location.second = value;
01291     } else if (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE")) {
01292         ship = SHIP3;
01293         location = saveslot->getPirateShipLocation(ship);
01294         location.second = value;
01295     } else {
01296         // we must be the fourth ship's longitude if we're here
01297         wxASSERT(event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE"));
01298         
01299         ship = SHIP4;
01300         location = saveslot->getPirateShipLocation(ship);
01301         location.second = value;
01302     }
01303     
01304     saveslot->setPirateShipLocation(ship, location);
01305 }
01306 
01307 void MainFrame::onShipUpdate(wxUpdateUIEvent &event) {
01308     if ((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE")) ||
01309        (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE"))) {
01310         event.Enable(XRCCTRL(*this,
01311                              "IDC_TRANSPORTATION_SHIP1",
01312                              wxCheckBox)->IsChecked());
01313     } else if ((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE")) ||
01314                (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE"))) {
01315         event.Enable(XRCCTRL(*this,
01316                              "IDC_TRANSPORTATION_SHIP2",
01317                              wxCheckBox)->IsChecked());
01318     } else if ((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE")) ||
01319                (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE"))) {
01320         event.Enable(XRCCTRL(*this,
01321                              "IDC_TRANSPORTATION_SHIP3",
01322                              wxCheckBox)->IsChecked());
01323     } else {
01324         // we must be the fourth ship
01325         wxASSERT((event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE")) ||
01326                  (event.GetId() == XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE")));
01327         
01328         event.Enable(XRCCTRL(*this,
01329                              "IDC_TRANSPORTATION_SHIP4",
01330                              wxCheckBox)->IsChecked());
01331     }
01332 }
01333 
01334 void MainFrame::onStartLocationChange(wxCommandEvent &event) {
01335     int city = event.GetSelection();
01336     
01337     for (int i = MOONGLOW_INN; i <= VESPER_INN; ++i) {
01338         if (city == INN_INDEX[i]) {
01339             saveslot->setStartLocation(static_cast<enum StartLocation>(i));
01340             break;
01341         }
01342     }
01343 }
01344 
01345 void MainFrame::onStatChange(wxCommandEvent &event) {
01346     if (ignoreEvents) {
01347         return;
01348     }
01349     
01350     wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
01351     enum Character character = static_cast<enum Character>
01352         (XRCCTRL(*this, "IDRB_CHARACTER_SELECT", wxRadioBox)->GetSelection());
01353     int value = std::atoi(ctrl->GetValue().mb_str());
01354 
01355     if (event.GetId() == XRCID("IDT_CHARACTER_LEVEL")) {
01356         saveslot->setLevel(character, value);
01357     } else if (event.GetId() == XRCID("IDT_CHARACTER_HP")) {
01358         saveslot->setCurrentHP(character, value);
01359     } else if (event.GetId() == XRCID("IDT_CHARACTER_MP")) {
01360         saveslot->setCurrentMP(character, value);
01361     } else if (event.GetId() == XRCID("IDT_CHARACTER_EXPERIENCE")) {
01362         saveslot->setExperience(character, value);
01363     } else if (event.GetId() == XRCID("IDT_CHARACTER_MAXHP")) {
01364         saveslot->setMaxHP(character, value);
01365     } else if (event.GetId() == XRCID("IDT_CHARACTER_MAXMP")) {
01366         saveslot->setMaxMP(character, value);
01367     } else if (event.GetId() == XRCID("IDT_CHARACTER_STRENGTH")) {
01368         saveslot->setStrength(character, value);
01369     } else if (event.GetId() == XRCID("IDT_CHARACTER_INTELLIGENCE")) {
01370         saveslot->setIntelligence(character, value);
01371     } else if (event.GetId() == XRCID("IDT_CHARACTER_DEXTERITY")) {
01372         saveslot->setDexterity(character, value);
01373     }
01374 }
01375 
01376 void MainFrame::onStoneChange(wxCommandEvent &event) {
01377     enum Virtue stone = HUMILITY;
01378 
01379     if (event.GetId() == XRCID("IDC_INVENTORY_BLUE")) {
01380         stone = HONESTY;
01381     } else if (event.GetId() == XRCID("IDC_INVENTORY_YELLOW")) {
01382         stone = COMPASSION;
01383     } else if (event.GetId() == XRCID("IDC_INVENTORY_RED")) {
01384         stone = VALOR;
01385     } else if (event.GetId() == XRCID("IDC_INVENTORY_GREEN")) {
01386         stone = JUSTICE;
01387     } else if (event.GetId() == XRCID("IDC_INVENTORY_ORANGE")) {
01388         stone = SACRIFICE;
01389     } else if (event.GetId() == XRCID("IDC_INVENTORY_PURPLE")) {
01390         stone = HONOR;
01391     } else if (event.GetId() == XRCID("IDC_INVENTORY_WHITE")) {
01392         stone = SPIRITUALITY;
01393     }
01394     
01395     saveslot->setStone(stone, event.IsChecked());
01396 }
01397 
01398 void MainFrame::onToolHaveChange(wxCommandEvent &event) {
01399     enum Tool tool = WHEEL;
01400 
01401     if (event.GetId() == XRCID("IDC_INVENTORY_KEY")) {
01402         tool = KEY;
01403     } else if (event.GetId() == XRCID("IDC_INVENTORY_SEXTANT")) {
01404         tool = SEXTANT;
01405     } else if (event.GetId() == XRCID("IDC_INVENTORY_SCALE")) {
01406         tool = SCALE;
01407     } else if (event.GetId() == XRCID("IDC_INVENTORY_FLUTE")) {
01408         tool = FLUTE;
01409     } else if (event.GetId() == XRCID("IDC_INVENTORY_CANDLE")) {
01410         tool = CANDLE;
01411     } else if (event.GetId() == XRCID("IDC_INVENTORY_BOOK")) {
01412         tool = BOOK;
01413     } else if (event.GetId() == XRCID("IDC_INVENTORY_BELL")) {
01414         tool = BELL;
01415     } else if (event.GetId() == XRCID("IDC_INVENTORY_HORN")) {
01416         tool = HORN;
01417     } else if (event.GetId() == XRCID("IDC_INVENTORY_SKULL")) {
01418         tool = SKULL;
01419     } else if (event.GetId() == XRCID("IDC_INVENTORY_TRUTHKEY")) {
01420         tool = TRUTHKEY;
01421     } else if (event.GetId() == XRCID("IDC_INVENTORY_LOVEKEY")) {
01422         tool = LOVEKEY;
01423     } else if (event.GetId() == XRCID("IDC_INVENTORY_COURAGEKEY")) {
01424         tool = COURAGEKEY;
01425     }
01426     
01427     saveslot->setTool(tool, (event.IsChecked() ? 1 : 0));
01428 }
01429 
01430 void MainFrame::onToolQuantityChange(wxScrollEvent &event) {
01431     enum Tool tool = OIL;
01432     
01433     if (event.GetId() == XRCID("IDS_INVENTORY_TORCH")) {
01434         tool = TORCH;
01435     } else if (event.GetId() == XRCID("IDS_INVENTORY_GEM")) {
01436         tool = GEM;
01437     }
01438     
01439     saveslot->setTool(tool, event.GetPosition());
01440 }
01441 
01442 void MainFrame::onVirtueChange(wxScrollEvent &event) {
01443     enum Virtue virtue = HUMILITY;
01444 
01445     if (event.GetId() == XRCID("IDS_HERO_HONESTY")) {
01446         virtue = HONESTY;
01447     } else if (event.GetId() == XRCID("IDS_HERO_COMPASSION")) {
01448         virtue = COMPASSION;
01449     } else if (event.GetId() == XRCID("IDS_HERO_VALOR")) {
01450         virtue = VALOR;
01451     } else if (event.GetId() == XRCID("IDS_HERO_JUSTICE")) {
01452         virtue = JUSTICE;
01453     } else if (event.GetId() == XRCID("IDS_HERO_SACRIFICE")) {
01454         virtue = SACRIFICE;
01455     } else if (event.GetId() == XRCID("IDS_HERO_HONOR")) {
01456         virtue = HONOR;
01457     } else if (event.GetId() == XRCID("IDS_HERO_SPIRITUALITY")) {
01458         virtue = SPIRITUALITY;
01459     }
01460     
01461     saveslot->setVirtue(virtue, event.GetPosition());
01462 }
01463 
01464 void MainFrame::onWhirlpoolChange(wxCommandEvent &event) {
01465     if (ignoreEvents) {
01466         return;
01467     }
01468     
01469     wxTextCtrl *ctrl = dynamic_cast<wxTextCtrl *>(event.GetEventObject());
01470     std::pair<int, int> location = saveslot->getWhirlpoolLocation();
01471     int value = std::atoi(ctrl->GetValue().mb_str());
01472     
01473     if (event.GetId() == XRCID("IDT_TRANSPORTATION_WHIRLPOOLLATITUDE")) {
01474         location.first = value;
01475     } else {
01476         // we must be longitude if we're here
01477         wxASSERT(event.GetId() ==
01478                  XRCID("IDT_TRANSPORTATION_WHIRLPOOLLONGITUDE"));
01479                  
01480         location.second = value;
01481     }
01482     
01483     saveslot->setWhirlpoolLocation(location);
01484 }
01485 
01486 void MainFrame::onWindowClosing(wxCloseEvent &event) {
01487     if (event.CanVeto()) {
01488         if (isOpen()) {
01489             if (!close()) {
01490                 event.Veto();
01491                 return;
01492             }
01493         }
01494     }
01495     
01496     Destroy();
01497 }
01498 
01499 BEGIN_EVENT_TABLE(MainFrame, wxFrame)
01500     EVT_CHECKBOX(XRCID("IDC_PARTY_MAGE"), MainFrame::onJoinedChange)
01501     EVT_CHECKBOX(XRCID("IDC_PARTY_BARD"), MainFrame::onJoinedChange)
01502     EVT_CHECKBOX(XRCID("IDC_PARTY_FIGHTER"), MainFrame::onJoinedChange)
01503     EVT_CHECKBOX(XRCID("IDC_PARTY_DRUID"), MainFrame::onJoinedChange)
01504     EVT_CHECKBOX(XRCID("IDC_PARTY_TINKER"), MainFrame::onJoinedChange)
01505     EVT_CHECKBOX(XRCID("IDC_PARTY_PALADIN"), MainFrame::onJoinedChange)
01506     EVT_CHECKBOX(XRCID("IDC_PARTY_RANGER"), MainFrame::onJoinedChange)
01507     EVT_CHECKBOX(XRCID("IDC_PARTY_SHEPHERD"), MainFrame::onJoinedChange)
01508 
01509     EVT_CHECKBOX(XRCID("IDC_PARTY_LIGHT"), MainFrame::onMagicChange)
01510     EVT_CHECKBOX(XRCID("IDC_PARTY_MISSILE"), MainFrame::onMagicChange)
01511     EVT_CHECKBOX(XRCID("IDC_PARTY_AWAKEN"), MainFrame::onMagicChange)
01512     EVT_CHECKBOX(XRCID("IDC_PARTY_CURE"), MainFrame::onMagicChange)
01513     EVT_CHECKBOX(XRCID("IDC_PARTY_WIND"), MainFrame::onMagicChange)
01514     EVT_CHECKBOX(XRCID("IDC_PARTY_HEAL"), MainFrame::onMagicChange)
01515     EVT_CHECKBOX(XRCID("IDC_PARTY_FIRE"), MainFrame::onMagicChange)
01516     EVT_CHECKBOX(XRCID("IDC_PARTY_EXIT"), MainFrame::onMagicChange)
01517     EVT_CHECKBOX(XRCID("IDC_PARTY_DISPEL"), MainFrame::onMagicChange)
01518     EVT_CHECKBOX(XRCID("IDC_PARTY_VIEW"), MainFrame::onMagicChange)
01519     EVT_CHECKBOX(XRCID("IDC_PARTY_PROTECT"), MainFrame::onMagicChange)
01520     EVT_CHECKBOX(XRCID("IDC_PARTY_ICE"), MainFrame::onMagicChange)
01521     EVT_CHECKBOX(XRCID("IDC_PARTY_BLINK"), MainFrame::onMagicChange)
01522     EVT_CHECKBOX(XRCID("IDC_PARTY_ENERGY"), MainFrame::onMagicChange)
01523     EVT_CHECKBOX(XRCID("IDC_PARTY_QUICK"), MainFrame::onMagicChange)
01524     EVT_CHECKBOX(XRCID("IDC_PARTY_SLEEP"), MainFrame::onMagicChange)
01525     EVT_CHECKBOX(XRCID("IDC_PARTY_REFLECT"), MainFrame::onMagicChange)
01526     EVT_CHECKBOX(XRCID("IDC_PARTY_NEGATE"), MainFrame::onMagicChange)
01527     EVT_CHECKBOX(XRCID("IDC_PARTY_DESTROY"), MainFrame::onMagicChange)
01528     EVT_CHECKBOX(XRCID("IDC_PARTY_JINX"), MainFrame::onMagicChange)
01529     EVT_CHECKBOX(XRCID("IDC_PARTY_SQUISH"), MainFrame::onMagicChange)
01530     EVT_CHECKBOX(XRCID("IDC_PARTY_GATE"), MainFrame::onMagicChange)
01531     EVT_CHECKBOX(XRCID("IDC_PARTY_TREMOR"), MainFrame::onMagicChange)
01532     EVT_CHECKBOX(XRCID("IDC_PARTY_LIFE"), MainFrame::onMagicChange)
01533     EVT_CHECKBOX(XRCID("IDC_PARTY_DEFEAT"), MainFrame::onMagicChange)
01534     
01535     EVT_CHECKBOX(XRCID("IDC_INVENTORY_HONESTY"), MainFrame::onRuneChange)
01536     EVT_CHECKBOX(XRCID("IDC_INVENTORY_COMPASSION"), MainFrame::onRuneChange)
01537     EVT_CHECKBOX(XRCID("IDC_INVENTORY_VALOR"), MainFrame::onRuneChange)
01538     EVT_CHECKBOX(XRCID("IDC_INVENTORY_JUSTICE"), MainFrame::onRuneChange)
01539     EVT_CHECKBOX(XRCID("IDC_INVENTORY_SACRIFICE"), MainFrame::onRuneChange)
01540     EVT_CHECKBOX(XRCID("IDC_INVENTORY_HONOR"), MainFrame::onRuneChange)
01541     EVT_CHECKBOX(XRCID("IDC_INVENTORY_SPIRITUALITY"), MainFrame::onRuneChange)
01542     EVT_CHECKBOX(XRCID("IDC_INVENTORY_HUMILITY"), MainFrame::onRuneChange)
01543     
01544     EVT_CHECKBOX(XRCID("IDC_INVENTORY_BLUE"), MainFrame::onStoneChange)
01545     EVT_CHECKBOX(XRCID("IDC_INVENTORY_YELLOW"), MainFrame::onStoneChange)
01546     EVT_CHECKBOX(XRCID("IDC_INVENTORY_RED"), MainFrame::onStoneChange)
01547     EVT_CHECKBOX(XRCID("IDC_INVENTORY_GREEN"), MainFrame::onStoneChange)
01548     EVT_CHECKBOX(XRCID("IDC_INVENTORY_ORANGE"), MainFrame::onStoneChange)
01549     EVT_CHECKBOX(XRCID("IDC_INVENTORY_PURPLE"), MainFrame::onStoneChange)
01550     EVT_CHECKBOX(XRCID("IDC_INVENTORY_WHITE"), MainFrame::onStoneChange)
01551     EVT_CHECKBOX(XRCID("IDC_INVENTORY_BLACK"), MainFrame::onStoneChange)
01552     
01553     EVT_CHECKBOX(XRCID("IDC_INVENTORY_KEY"), MainFrame::onToolHaveChange)
01554     EVT_CHECKBOX(XRCID("IDC_INVENTORY_SEXTANT"), MainFrame::onToolHaveChange)
01555     EVT_CHECKBOX(XRCID("IDC_INVENTORY_SCALE"), MainFrame::onToolHaveChange)
01556     EVT_CHECKBOX(XRCID("IDC_INVENTORY_FLUTE"), MainFrame::onToolHaveChange)
01557     EVT_CHECKBOX(XRCID("IDC_INVENTORY_CANDLE"), MainFrame::onToolHaveChange)
01558     EVT_CHECKBOX(XRCID("IDC_INVENTORY_BOOK"), MainFrame::onToolHaveChange)
01559     EVT_CHECKBOX(XRCID("IDC_INVENTORY_BELL"), MainFrame::onToolHaveChange)
01560     EVT_CHECKBOX(XRCID("IDC_INVENTORY_HORN"), MainFrame::onToolHaveChange)
01561     EVT_CHECKBOX(XRCID("IDC_INVENTORY_SKULL"), MainFrame::onToolHaveChange)
01562     EVT_CHECKBOX(XRCID("IDC_INVENTORY_TRUTHKEY"), MainFrame::onToolHaveChange)
01563     EVT_CHECKBOX(XRCID("IDC_INVENTORY_COURAGEKEY"), MainFrame::onToolHaveChange)
01564     EVT_CHECKBOX(XRCID("IDC_INVENTORY_LOVEKEY"), MainFrame::onToolHaveChange)
01565     EVT_CHECKBOX(XRCID("IDC_INVENTORY_WHEEL"), MainFrame::onToolHaveChange)
01566     
01567     EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP1"), MainFrame::onShipChange)
01568     EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP2"), MainFrame::onShipChange)
01569     EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP3"), MainFrame::onShipChange)
01570     EVT_CHECKBOX(XRCID("IDC_TRANSPORTATION_SHIP4"), MainFrame::onShipChange)
01571     
01572     EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED1"),
01573         MainFrame::onEquippedChange)
01574     EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED2"),
01575         MainFrame::onEquippedChange)
01576     EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED3"),
01577         MainFrame::onEquippedChange)
01578     EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED4"),
01579         MainFrame::onEquippedChange)
01580     EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED5"),
01581         MainFrame::onEquippedChange)
01582     EVT_CHECKBOX(XRCID("IDC_CHARACTER_EQUIPPED6"),
01583         MainFrame::onEquippedChange)
01584         
01585     EVT_CHOICE(XRCID("IDC_PARTY_START"), MainFrame::onStartLocationChange)
01586         
01587     EVT_CHOICE(XRCID("IDC_PARTY_MEMBER1"), MainFrame::onMemberClassChange)
01588     EVT_CHOICE(XRCID("IDC_PARTY_MEMBER2"), MainFrame::onMemberClassChange)
01589     EVT_CHOICE(XRCID("IDC_PARTY_MEMBER3"), MainFrame::onMemberClassChange)
01590     EVT_CHOICE(XRCID("IDC_PARTY_MEMBER4"), MainFrame::onMemberClassChange)
01591     
01592     EVT_CHOICE(XRCID("IDC_TRANSPORTATION_TRAMMEL"), MainFrame::onPhaseChange)
01593     EVT_CHOICE(XRCID("IDC_TRANSPORTATION_FELUCCA"), MainFrame::onPhaseChange)
01594     
01595     EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT1"), MainFrame::onEquipmentChange)
01596     EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT2"), MainFrame::onEquipmentChange)
01597     EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT3"), MainFrame::onEquipmentChange)
01598     EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT4"), MainFrame::onEquipmentChange)
01599     EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT5"), MainFrame::onEquipmentChange)
01600     EVT_CHOICE(XRCID("IDC_CHARACTER_EQUIPMENT6"), MainFrame::onEquipmentChange)
01601     
01602     EVT_CLOSE(MainFrame::onWindowClosing)
01603     
01604     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_HONESTY"), MainFrame::onVirtueChange)
01605     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_COMPASSION"), MainFrame::onVirtueChange)
01606     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_VALOR"), MainFrame::onVirtueChange)
01607     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_JUSTICE"), MainFrame::onVirtueChange)
01608     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_SACRIFICE"), MainFrame::onVirtueChange)
01609     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_HONOR"), MainFrame::onVirtueChange)
01610     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_SPIRITUALITY"),MainFrame::onVirtueChange)
01611     EVT_COMMAND_SCROLL(XRCID("IDS_HERO_HUMILITY"), MainFrame::onVirtueChange)
01612 
01613     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_ASH"), MainFrame::onHerbChange)
01614     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_GINSENG"), MainFrame::onHerbChange)
01615     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_GARLIC"), MainFrame::onHerbChange)
01616     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_SILKWEB"), MainFrame::onHerbChange)
01617     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_MOSS"), MainFrame::onHerbChange)
01618     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_PEARL"), MainFrame::onHerbChange)
01619     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_FUNGUS"), MainFrame::onHerbChange)
01620     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_MANROOT"), MainFrame::onHerbChange)
01621     
01622     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_TORCH"),
01623         MainFrame::onToolQuantityChange)
01624     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_GEM"),
01625         MainFrame::onToolQuantityChange)
01626     EVT_COMMAND_SCROLL(XRCID("IDS_INVENTORY_OIL"),
01627         MainFrame::onToolQuantityChange)
01628         
01629     EVT_MENU(wxID_OPEN, MainFrame::onFileOpen)
01630     EVT_MENU(wxID_SAVE, MainFrame::onFileSave)
01631     EVT_MENU(wxID_SAVEAS, MainFrame::onFileSaveAs)
01632     EVT_MENU(wxID_CLOSE, MainFrame::onFileClose)
01633     EVT_MENU(wxID_EXIT, MainFrame::onFileExit)
01634 
01635     EVT_MENU(XRCID("IDM_GAME_GAME1"), MainFrame::onGameChange)
01636     EVT_MENU(XRCID("IDM_GAME_GAME2"), MainFrame::onGameChange)
01637     EVT_MENU(XRCID("IDM_GAME_GAME3"), MainFrame::onGameChange)
01638     
01639     EVT_MENU(XRCID("IDM_LOCATION_PLACE_MOONGLOW"),
01640         MainFrame::onLocationPlaceChange)
01641     EVT_MENU(XRCID("IDM_LOCATION_PLACE_BRITAIN"),
01642         MainFrame::onLocationPlaceChange)
01643     EVT_MENU(XRCID("IDM_LOCATION_PLACE_JHELOM"),
01644         MainFrame::onLocationPlaceChange)
01645     EVT_MENU(XRCID("IDM_LOCATION_PLACE_YEW"),
01646         MainFrame::onLocationPlaceChange)
01647     EVT_MENU(XRCID("IDM_LOCATION_PLACE_MINOC"),
01648         MainFrame::onLocationPlaceChange)
01649     EVT_MENU(XRCID("IDM_LOCATION_PLACE_TRINSIC"),
01650         MainFrame::onLocationPlaceChange)
01651     EVT_MENU(XRCID("IDM_LOCATION_PLACE_SKARABRAE"),
01652         MainFrame::onLocationPlaceChange)
01653     EVT_MENU(XRCID("IDM_LOCATION_PLACE_MAGINCIA"),
01654         MainFrame::onLocationPlaceChange)
01655     
01656     EVT_MENU(XRCID("IDM_LOCATION_PLACE_LYCAEUM"),
01657         MainFrame::onLocationPlaceChange)
01658     EVT_MENU(XRCID("IDM_LOCATION_PLACE_EMPATHABBEY"),
01659         MainFrame::onLocationPlaceChange)
01660     EVT_MENU(XRCID("IDM_LOCATION_PLACE_SERPENTSHOLD"),
01661         MainFrame::onLocationPlaceChange)
01662     
01663     EVT_MENU(XRCID("IDM_LOCATION_PLACE_PAWS"),
01664         MainFrame::onLocationPlaceChange)
01665     EVT_MENU(XRCID("IDM_LOCATION_PLACE_VESPER"),
01666         MainFrame::onLocationPlaceChange)
01667     EVT_MENU(XRCID("IDM_LOCATION_PLACE_BUCCANEERSDEN"),
01668         MainFrame::onLocationPlaceChange)
01669     EVT_MENU(XRCID("IDM_LOCATION_PLACE_COVE"),
01670         MainFrame::onLocationPlaceChange)
01671     
01672     EVT_MENU(XRCID("IDM_LOCATION_BALLOON"), MainFrame::onLocationBalloon)
01673     
01674     EVT_MENU(XRCID("IDM_LOCATION_SHIP1"), MainFrame::onLocationShip)
01675     EVT_MENU(XRCID("IDM_LOCATION_SHIP2"), MainFrame::onLocationShip)
01676     EVT_MENU(XRCID("IDM_LOCATION_SHIP3"), MainFrame::onLocationShip)
01677     EVT_MENU(XRCID("IDM_LOCATION_SHIP4"), MainFrame::onLocationShip)
01678 
01679     EVT_MENU(wxID_ABOUT, MainFrame::onHelpAbout)
01680     
01681     EVT_RADIOBOX(XRCID("IDRB_CHARACTER_SELECT"), MainFrame::onCharacterChange)
01682     
01683     EVT_TEXT(XRCID("IDT_HERO_NAME"), MainFrame::onHerosNameChange)
01684     
01685     EVT_TEXT(XRCID("IDT_PARTY_GOLD"), MainFrame::onGoldChange)
01686     
01687     EVT_TEXT(XRCID("IDT_TRANSPORTATION_BALLOONLATITUDE"),
01688         MainFrame::onBalloonChange)
01689     EVT_TEXT(XRCID("IDT_TRANSPORTATION_BALLOONLONGITUDE"),
01690         MainFrame::onBalloonChange)
01691         
01692     EVT_TEXT(XRCID("IDT_TRANSPORTATION_WHIRLPOOLLATITUDE"),
01693         MainFrame::onWhirlpoolChange)
01694     EVT_TEXT(XRCID("IDT_TRANSPORTATION_WHIRLPOOLLONGITUDE"),
01695         MainFrame::onWhirlpoolChange)
01696     
01697     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE"),
01698         MainFrame::onShipLocationChange)
01699     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE"),
01700         MainFrame::onShipLocationChange)
01701     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE"),
01702         MainFrame::onShipLocationChange)
01703     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE"),
01704         MainFrame::onShipLocationChange)
01705     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE"),
01706         MainFrame::onShipLocationChange)
01707     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE"),
01708         MainFrame::onShipLocationChange)
01709     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE"),
01710         MainFrame::onShipLocationChange)
01711     EVT_TEXT(XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE"),
01712         MainFrame::onShipLocationChange)
01713         
01714     EVT_TEXT(XRCID("IDT_CHARACTER_LEVEL"), MainFrame::onStatChange)
01715     EVT_TEXT(XRCID("IDT_CHARACTER_EXPERIENCE"), MainFrame::onStatChange)
01716     EVT_TEXT(XRCID("IDT_CHARACTER_HP"), MainFrame::onStatChange)
01717     EVT_TEXT(XRCID("IDT_CHARACTER_MP"), MainFrame::onStatChange)
01718     EVT_TEXT(XRCID("IDT_CHARACTER_MAXHP"), MainFrame::onStatChange)
01719     EVT_TEXT(XRCID("IDT_CHARACTER_MAXMP"), MainFrame::onStatChange)
01720     EVT_TEXT(XRCID("IDT_CHARACTER_STRENGTH"), MainFrame::onStatChange)
01721     EVT_TEXT(XRCID("IDT_CHARACTER_INTELLIGENCE"), MainFrame::onStatChange)
01722     EVT_TEXT(XRCID("IDT_CHARACTER_DEXTERITY"), MainFrame::onStatChange)
01723     
01724     EVT_UPDATE_UI(wxID_CLOSE, MainFrame::onSaveCloseUpdate)
01725     EVT_UPDATE_UI(wxID_SAVE, MainFrame::onSaveUpdate)
01726     EVT_UPDATE_UI(wxID_SAVEAS, MainFrame::onSaveCloseUpdate)
01727     
01728     EVT_UPDATE_UI(XRCID("IDM_GAME_GAME1"), MainFrame::onGameMenuUpdate)
01729     EVT_UPDATE_UI(XRCID("IDM_GAME_GAME2"), MainFrame::onGameMenuUpdate)
01730     EVT_UPDATE_UI(XRCID("IDM_GAME_GAME3"), MainFrame::onGameMenuUpdate)
01731     
01732     EVT_UPDATE_UI(XRCID("IDC_PARTY_MEMBER3"), MainFrame::onMemberUpdate)
01733     EVT_UPDATE_UI(XRCID("IDC_PARTY_MEMBER4"), MainFrame::onMemberUpdate)
01734     
01735     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP1LATITUDE"),
01736         MainFrame::onShipUpdate)
01737     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP2LATITUDE"),
01738         MainFrame::onShipUpdate)
01739     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP3LATITUDE"),
01740         MainFrame::onShipUpdate)
01741     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP4LATITUDE"),
01742         MainFrame::onShipUpdate)
01743     
01744     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP1LONGITUDE"),
01745         MainFrame::onShipUpdate)
01746     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP2LONGITUDE"),
01747         MainFrame::onShipUpdate)
01748     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP3LONGITUDE"),
01749         MainFrame::onShipUpdate)
01750     EVT_UPDATE_UI(XRCID("IDT_TRANSPORTATION_SHIP4LONGITUDE"),
01751         MainFrame::onShipUpdate)
01752     
01753     EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED1"), MainFrame::onEquippedUpdate)
01754     EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED2"), MainFrame::onEquippedUpdate)
01755     EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED3"), MainFrame::onEquippedUpdate)
01756     EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED4"), MainFrame::onEquippedUpdate)
01757     EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED5"), MainFrame::onEquippedUpdate)
01758     EVT_UPDATE_UI(XRCID("IDC_CHARACTER_EQUIPPED6"), MainFrame::onEquippedUpdate)
01759 END_EVENT_TABLE()
01760 
01761 IMPLEMENT_CLASS(MainFrame, wxFrame)
01762 

Generated on Sat Feb 24 10:38:51 2007 for hack4u by  doxygen 1.5.1-p1